//
//  Problem925.swift
//  TestProject
//
//  Created by 毕武侠 on 2021/3/28.
//  Copyright © 2021 zhulong. All rights reserved.
//

import UIKit

/*
 925. 长按键入 【上一个字符】
 你的朋友正在使用键盘输入他的名字 name。偶尔，在键入字符 c 时，按键可能会被长按，而字符可能被输入 1 次或多次。
 你将会检查键盘输入的字符 typed。如果它对应的可能是你的朋友的名字（其中一些字符可能被长按），那么就返回 True。

 示例 1：
     输入：name = "alex", typed = "aaleex"
     输出：true
     解释：'alex' 中的 'a' 和 'e' 被长按。
 示例 2：
     输入：name = "saeed", typed = "ssaaedd"
     输出：false
     解释：'e' 一定需要被键入两次，但在 typed 的输出中不是这样。
 示例 3：
     输入：name = "leelee", typed = "lleeelee"
     输出：true
 示例 4：
     输入：name = "laiden", typed = "laiden"
     输出：true
     解释：长按名字中的字符并不是必要的。
 提示：
     name.length <= 1000
     typed.length <= 1000
     name 和 typed 的字符都是小写字母。
 */
@objcMembers class Problem925: NSObject {
    func solution() {
        print(isLongPressedName("alex", "aaleex"))
        print(isLongPressedName("saeed", "ssaaedd"))
        print(isLongPressedName("leelee", "lleeelee"))
        print(isLongPressedName("laiden", "laiden"))
        print(isLongPressedName("vtkgn", "vttkgnn"))
        
        print(isLongPressedName("pyplrz", "ppyypllr"))
    }
    
    /*
     1: 遍历2个字符串
     2: 当2个字符相同name[i] == typed[i]，继续遍历 i += 1
     3: 2个字符不相同name[i] == typed[i]，如果typed[i] == name[i-1]字符相同, 那么typed[i]是长按的
     注意：不要超过name
     */
    func isLongPressedName(_ name: String, _ typed: String) -> Bool {
        if typed.count < name.count {
            return false
        }
        
        var lastC: Character? = nil
        let charts = Array(name)
        var i = 0
        for c in typed {
            if i < charts.count && c == charts[i] {     // 考察点：不要超过charts的长度
                lastC = c
                i += 1
            } else if c == lastC {
                continue
            } else {
                return false
            }
        }
        
        return i == charts.count        // 考察点：如果typed已经遍历完，但charts没有遍历完就是错误的
    }
}
